(PYTHON) Day - 21 Python Functionals

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank


Python Functionals


Map and Lambda Function


문제 : 피보나치 수열을 출력하는 문제
입력 : 수열의 길이
출력 : 피보나치 수열 리스트

5

[0, 1, 1, 8, 27]

기본 형식에 맞춰서 문제를 풀면 다음과 같다

cube = lambda x: x\*\*3 # complete the lambda function

def fibonacci(n): # return a list of fibonacci numbers
fibo = [0, 1]
for i in range(2, n):
fibo.append(fibo[i-1]+fibo[i-2])

return fibo[0:n]

if **name** == '**main**':
n = int(input())
print(list(map(cube, fibonacci(n))))

피보나치 수열을 재귀함수로 풀면서 lambda 함수로 표현하면 다음과 같다

cube = lambda x: x\*\*3 # complete the lambda function

fibonacci = lambda x: x if x <= 1 else fibonacci(x-1) + fibonacci(x-2)

if **name** == '**main**':
n = int(input())
print(list(map(cube, map(fibonacci, range(n)))))

Validating Email Addresses With a Filter


문제 : 유효한 이메일 주소를 사전순으로 출력하는 문제
입력 : 이메일 개수 N; (N 반복) 이메일 주소
출력 : 사전순으로 정렬된 리스트로 출력
조건 :
username@websitename.extension 형식을 따른다
username은 오직 문자, 숫자, 대시 그리고 언더스코어만 가질 수 있다
websitename은 오직 문자와 숫자만 가질 수 있다
extension의 최대 길이는 3 이다

3
lara@hackerrank.com
brian-23@hackerrank.com
britts_54@hackerrank.com

[‘brian-23@hackerrank.com’, ‘britts_54@hackerrank.com’, ‘lara@hackerrank.com’]

isalnum() 함수를 사용하여 문자나 숫자로 이루어졌는지 확인할 수 있다

def fun(s): # return True if s is a valid email, else return False
try:
username, site = s.split('@')
websitename, extension = site.split('.')
except:
return False

username = ''.join(i for i in username if i not in "-_")

return username.isalnum() and websitename.isalnum() and len(extension) <= 3

def filter_mail(emails):
return list(filter(fun, emails))

if **name** == '**main**':
n = int(input())
emails = []
for \_ in range(n):
emails.append(input())

filtered_emails = filter_mail(emails)
filtered_emails.sort()
print(filtered_emails)

정규표현식을 사용하면서 and 연산자가 아닌 all 연산자로 마지막을 확인하는 방법(fun 함수만 작성 이하 동일)

import re

def fun(s):
try:
user,website,domain=re.split('\@|\.',s)
except:
return False
processed=user.replace('-','').replace('\_','')
return all( [processed.isalnum(), website.isalnum(), len(domain)<=3] )

__


Reduce Function


문제 : (분수로 표현되는)유리수들의 곱셈 결과를 출력하는 문제
입력 : 유리수 개수 n; (n 반복) 분자, 분모 형식으로 입력;
출력 : 곱셈의 결과

3
1 2
3 4
10 6

5 8

reduce() 함수 안에서 lambda 식을 사용하지 않고도 operator 모듈을 사용해서 구현할 수 있는 것을 배웠다

from fractions import Fraction
from functools import reduce

# from operator import mul

def product(fracs):
t = reduce(lambda x, y: x \* y, fracs) # t = reduce(mul, fracs)
return t.numerator, t.denominator

if **name** == '**main**':
fracs = []
for \_ in range(int(input())):
fracs.append(Fraction(*map(int, input().split())))
result = product(fracs)
print(*result)